import pandas as pd
import re
from tabulate import tabulate

def create_student_dataframe():
    """基于文档1的学生数据，构造DataFrame，避免文件路径依赖"""
    data = [
        [1, '2123310401', '陈福强', '男', 18, '469***************8918', '152*****0858', '海南省儋州市国营红岭农场桥南路11号'],
        [2, '2123310402', '陈汉宇', '女', 19, '460***************6022', '188*****1295', '海南省白沙县金波乡金波十八队'],
        [3, '2123310403', '陈南成', '男', 18, '460***************6835', '188*****2861', '海南省临高县东英镇东英居委会解放路南62号'],
        [4, '2123310404', '陈鹏', '男', 19, '220***************1617', '182*****6463', '吉林省松原市长岭县大兴镇大兴村'],
        [5, '2123310405', '陈松杰', '男', 20, '460***************0917', '188*****4928', '海南省海口市美兰区海府路101-3号'],
        [6, '2123310406', '陈宗辉', '男', 16, '460***************001X', '175*****7120', '海南省儋州市那大镇学府美院803号'],
        [7, '2123310407', '方贵涛', '男', 29, '460***************1211', '177*****0812', '海南省三亚市吉阳区市仔村南新悦城小区'],
        [8, '2123310408', '符大豪', '男', 31, '460***************0714', '183*****2960', '海南省文昌市重兴镇东风村委会高步一村'],
        [9, '2123310409', '符日恩', '男', 22, '469***************4971', '139*****2262', '海南省东方市八所镇大占坡村'],
        [10, '2123310410', '符显强', '男', 34, '460***************0513', '155*****7431', '海南省文昌市拥军路14号'],
        [11, '2123310411', '何影影', '女', 27, '460***************6826', '132*****2698', '海南省东方市东河镇金炳村'],
        [12, '2123310412', '黄馨丹', '女', 36, '460***************0425', '185*****6173', '海南省保亭黎族苗族自治县什玲镇椰村村委会平土村'],
        [13, '2123310413', '黄耀', '男', 17, '460***************5916', '187*****5690', '海南省海口市琼山区龙昆南路59号'],
        [14, '2123310414', '黄业鑫', '男', 20, '460***************0038', '181*****1676', '海南省东方市八所镇铁路南工人新村3栋102号'],
        [15, '2123310415', '纪新帆', '男', 30, '460***************0610', '139*****6426', '海南省海口市秀英街道金鼎路金城苑'],
        [16, '2123310416', '黎俊文', '男', 32, '460***************4433', '131*****4250', '海南省三亚市崖州区崖城镇中心大道'],
        [17, '2123310417', '梁敏敏', '女', 23, '450***************2521', '173*****2489', '广西梧州市苍梧县岭脚镇龙潭村'],
        [18, '2123310418', '林铭', '男', 27, '460***************1516', '158*****7607', '海南省海口市海甸岛二东路广益新村'],
        [19, '2123310419', '林士师', '男', 31, '460***************5214', '189*****2873', '海南省海口市滨江街道高登东街110号琼山地税局九层楼宿舍'],
        [20, '2123310420', '刘政见', '男', 19, '131***************241X', '152*****8629', '河北省廊坊市广阳区大枣林庄村'],
        [21, '2123310421', '龙仕锦', '男', 15, '460***************581X', '186*****2003', '海南省儋州市八一总场文明东路十二栋六号'],
        [22, '2123310422', '潘金娜', '女', 37, '460***************3723', '173*****4081', '海南省文昌市公坡镇锦东村委会东排山村6号'],
        [23, '2123310423', '彭恩慧', '男', 32, '460***************0018', '130*****5806', '海南省儋州市兰洋镇番加农场'],
        [24, '2123310424', '阮金海', '男', 28, '440***************6153', '188*****7938', '海南省海口市琼山区新大洲大道222号'],
        [25, '2123310425', '汤健', '男', 33, '533***************0011', '135*****3225', '云南省丽江市古城区香江花园一区35栋501'],
        [26, '2123310426', '王炳坤', '男', 42, '460***************0896', '133*****8259', '海南省东方市八所镇皇宁村二区七巷一号'],
        [27, '2123310427', '王经助', '男', 71, '469***************3870', '151*****0837', '海南省乐东县黎族自治县佛罗镇白井村委会永德村一队60号'],
        [28, '2123310428', '王康荣', '男', 83, '460***************5839', '151*****4329', '海南省海口市琼山区三门坡镇北冲村'],
        [29, '2123310429', '王著', '男', 45, '460***************0014', '153*****6805', '海南省海口市府城街道海怡路21号'],
        [30, '2123310430', '王姿', '女', 34, '460***************2623', '139*****2760', '海南省海口市琼山区新桥路'],
        [31, '2123310431', '韦佳壮', '男', 43, '450***************1231', '150*****8045', '广西壮族自治区港北区庆丰镇万新村万安屯255号'],
        [32, '2123310432', '翁冉', '女', 32, '411***************6320', '180*****2463', '河南省郑州市新郑市孟庄镇唐河村'],
        [33, '2123310433', '谢金豆', '男', 56, '511***************0971', '147*****0695', '四川省广安市邻水县观音桥镇七一村5组38号'],
        [34, '2123310434', '徐文杰', '男', 29, '430***************0537', '155*****7886', '湖南省邵阳市武冈市商三街十栋'],
        [35, '2123310435', '徐鑫诚', '男', 31, '441***************7113', '134*****1513', '广东省惠州市淡水镇星河丹堤'],
        [36, '2123310436', '颜璟钧', '男', 15, '460***************0013', '182*****6608', '海南省临高县临城镇跃进居委会跃进路生产资料仓库宿舍4栋110号'],
        [37, '2123310437', '杨家意', '男', 19, '450***************1219', '173*****1413', '广西省贵港市港北区庆丰镇联塘村金塘屯247号'],
        [38, '2123310438', '杨杰', '男', 26, '522***************0819', '175*****3937', '贵州省铜仁市石阡县龙塘镇关门岩村三组'],
        [39, '2123310439', '杨锦', '男', 37, '441***************0411', '137*****0423', '广东省梅州市丰顺县丰良镇'],
        [40, '2123310440', '张昌子', '男', 41, '460***************2219', '138*****9062', '海南省海口市琼山区滨江路河口路'],
        [41, '2123310441', '张福胜', '男', 52, '460***************7470', '176*****7681', '海南省乐东黎族自治县志仲镇塔丰村委会塔丰七队69号'],
        [42, '2123310442', '张祥', '男', 43, '460***************6411', '151*****4460', '海南省昌江黎族自治县海尾镇海楼街四巷28号'],
        [43, '2123310443', '张运旺', '男', 36, '469***************4614', '155*****1585', '海南省琼海市大路镇礼合3村'],
        [44, '2123310444', '郑孟陵', '女', 43, '469***************4427', '182*****1330', '海南省琼海市龙江镇'],
        [45, '2123310445', '郑有环', '男', 25, '469***************4415', '199*****6503', '海南省陵水县群英乡祖空村委会针内村12号']
    ]
    columns = ['序号', '学号', '姓名', '性别', '年龄', '身份证号', '电话号码', '家庭地址']
    return pd.DataFrame(data, columns=columns)

# -------------------------- 任务1：读取并打印学生数据（表格形式） --------------------------
print("="*100)
print("【任务1：student.xlsx文件内容（表格形式）】")
print("="*100)
# 生成学生DataFrame（替代读取Excel文件）
student_df = create_student_dataframe()
# 打印数据基本信息
print(f"数据总行数（学生总数）：{len(student_df)} 人")
print(f"数据总列数：{len(student_df.columns)} 列")
print(f"列名：{list(student_df.columns)}")
print("\n完整学生信息表格如下：")
# 使用tabulate生成表格
print(tabulate(student_df, headers='keys', tablefmt='psql', showindex=False))

# -------------------------- 任务2：按性别统计学生人数 --------------------------
print("\n" + "="*100)
print("【任务2：按性别统计学生人数】")
print("="*100)
gender_count = student_df['性别'].value_counts()
for gender, count in gender_count.items():
    print(f"{gender}生人数：{count} 人")
# 补充占比（提升结果完整性）
gender_ratio = (student_df['性别'].value_counts(normalize=True) * 100).round(2)
for gender, ratio in gender_ratio.items():
    print(f"{gender}生占比：{ratio}%")

# -------------------------- 任务3：按年龄段统计学生人数 --------------------------
print("\n" + "="*100)
print("【任务3：按年龄段统计学生人数】")
print("="*100)
# 定义年龄段划分（覆盖15-83岁所有年龄）
def get_age_group(age):
    if 15 <= age <= 20:
        return "15-20岁"
    elif 21 <= age <= 30:
        return "21-30岁"
    elif 31 <= age <= 40:
        return "31-40岁"
    else:
        return "41岁及以上"
# 新增年龄段列并统计
student_df['年龄段'] = student_df['年龄'].apply(get_age_group)
age_group_order = ["15-20岁", "21-30岁", "31-40岁", "41岁及以上"]
age_count = student_df['年龄段'].value_counts().reindex(age_group_order, fill_value=0)
# 打印结果
for age_group, count in age_count.items():
    print(f"{age_group}：{count} 人")
# 补充占比
age_ratio = (student_df['年龄段'].value_counts(normalize=True) * 100).reindex(age_group_order, fill_value=0).round(2)
for age_group, ratio in age_ratio.items():
    print(f"{age_group}占比：{ratio}%")

# -------------------------- 任务4：按地区统计学生人数 --------------------------
print("\n" + "="*100)
print("【任务4：按地区统计学生人数（海南按市县，外省按省份）】")
print("="*100)
# 定义海南市县常量（统一维护，便于修改）
HAINAN_CITIES = [
    "海口市", "儋州市", "白沙县", "临高县", "文昌市", "东方市",
    "保亭黎族苗族自治县", "乐东县黎族自治县", "三亚市", "陵水县",
    "昌江黎族自治县", "琼海市"
]
# 提取地区（海南取市县，外省取省份）
def extract_region(address):
    # 先匹配海南市县
    for city in HAINAN_CITIES:
        if city in address:
            return city
    # 再匹配外省省份（含“省”“自治区”）
    province_pattern = r'([^省市区]+[省自治区])'
    match = re.search(province_pattern, address)
    if match:
        return match.group(1)
    # 特殊地址兼容（如“广西省”）
    special_map = {"广西省": "广西壮族自治区"}
    for key, val in special_map.items():
        if key in address:
            return val
    return "其他"

# 新增地区列并统计
student_df['地区'] = student_df['家庭地址'].apply(extract_region)
region_count = student_df['地区'].value_counts().sort_values(ascending=False)

# 分别打印海南和外省数据
print("一、海南省各市县学生人数：")
hainan_regions = [r for r in region_count.index if r in HAINAN_CITIES]
for